#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
微信后端REST API接口（合并版本）
采用MVC架构模式，将路由和控制器合并
"""

from flask import Flask
from flask_cors import CORS
import traceback

# 导入统一配置系统
from settings.config import config, logger, get_flask_config, get_database_url

# 导入合并后的控制器蓝图
# 注意：这里需要先导入控制器，确保路由被注册
from controllers.message_controller_combined import message_bp
from controllers.account_controller_combined import account_bp
from controllers.status_controller_combined import status_bp
from controllers.health_controller_combined import health_bp
from controllers.config_controller_combined import config_bp
from controllers.news_controller_combined import news_bp
from controllers.contact_controller_combined import contact_bp
from controllers.welcome_controller_combined import welcome_bp
from controllers.group_controller_combined import group_bp
# 导入数据库配置
from utils.database import init_database, create_tables

def create_app():
    """
    创建Flask应用
    
    Returns:
        Flask: Flask应用实例
    """
    # 创建Flask应用
    app = Flask(__name__)
    
    # 应用Flask配置
    flask_config = get_flask_config()
    app.config.update(flask_config)
    
    # 启用CORS
    cors_origins = config.security.cors_origins
    CORS(app, origins=cors_origins)
    
    logger.info("正在初始化微信后端API服务...")
    
    # 初始化数据库
    database_url = get_database_url()
    init_database(app, database_url=database_url)
    
    # 创建数据库表
    create_tables(app)
    
    # 注册错误处理器
    register_error_handlers(app)
    
    # 注册路由蓝图
    register_blueprints(app)
    
    # 初始化任务管理器
    try:
        from utils.async_task.task_manager import init_task_manager
        init_task_manager(app)
        logger.info("任务管理器初始化完成")
    except Exception as e:
        logger.error(f"初始化任务管理器失败: {str(e)}")
    
    logger.info("微信后端API服务初始化完成")
    
    return app

def register_error_handlers(app):
    """
    注册错误处理器
    
    Args:
        app: Flask应用实例
    """
    from flask import jsonify
    from utils.R.response import ApiResponse
    
    # 注册自定义响应处理
    from utils.R.response import ApiResponse
    
    # 修改视图函数返回值处理
    original_make_response = app.make_response
    
    def custom_make_response(rv):
        if isinstance(rv, ApiResponse):
            return original_make_response(rv.jsonify())
        return original_make_response(rv)
    
    app.make_response = custom_make_response
    
    @app.errorhandler(404)
    def not_found(error):
        return jsonify({
            "success": False,
            "error": "API端点不存在",
            "code": 404
        }), 404
    
    @app.errorhandler(500)
    def internal_error(error):
        return jsonify({
            "success": False,
            "error": "服务器内部错误",
            "code": 500
        }), 500
    
    @app.errorhandler(400)
    def bad_request(error):
        return jsonify({
            "success": False,
            "error": "请求参数错误",
            "code": 400
        }), 400
    
    @app.errorhandler(Exception)
    def handle_exception(error):
        logger.error(f"未处理的异常: {error}")
        logger.error(traceback.format_exc())
        return jsonify({
            "success": False,
            "error": "服务器内部错误",
            "code": 500
        }), 500

def register_blueprints(app):
    """
    注册路由蓝图
    
    Args:
        app: Flask应用实例
    """
    # 注册合并后的控制器蓝图
    app.register_blueprint(message_bp)
    app.register_blueprint(account_bp)
    app.register_blueprint(status_bp)
    
    # 注册其他原有蓝图
    app.register_blueprint(health_bp)
    app.register_blueprint(config_bp)
    app.register_blueprint(news_bp)
    app.register_blueprint(contact_bp)
    app.register_blueprint(welcome_bp)
    app.register_blueprint(group_bp)
    
    logger.info("所有路由蓝图注册完成")

def main():
    """
    主函数 - 启动API服务器
    """
    print("🚀 启动微信后端API服务器（合并版本）...")
    
    try:
        app = create_app()
        
        # 从配置获取服务器参数
        host = config.flask.host
        port = config.flask.port
        debug = config.flask.debug
        
        logger.info(f"服务器配置: host={host}, port={port}, debug={debug}")
        
        # 启动服务器
        app.run(
            host=host,
            port=port,
            debug=debug,
            threaded=True
        )
        
    except KeyboardInterrupt:
        print("\n👋 用户中断，API服务器停止")
        logger.info("API服务器停止")
    except Exception as e:
        print(f"❌ API服务器启动失败: {e}")
        logger.error(f"API服务器启动失败: {e}")
        traceback.print_exc()


if __name__ == "__main__":
    main()